package de.dis2011.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

import de.dis2011.data.DB2ConnectionManager;

/**
 * Wohnung-Bean
 */
public class Wohnung {
	private int 	id = -1;
	private String 	ort;
	private String 	plz;
	private String 	strasse;
	private String 	hausnr;
	private int 	flaeche;
	private int 	stockwerk;
	private int 	mietpreis;
	private int 	zimmer;
	private boolean balkon;
	private boolean ebk;
	private int 	verwalter;
	
	public int getId() {return id;}
	public void setId(int id) {	this.id = id;}
	
	public String getOrt() {return ort;}
	public void setOrt(String ort) {this.ort = ort;}
	
	public String getPlz() {return plz;}
	public void setPlz(String plz) {this.plz = plz;}
	
	public String getStrasse() {return strasse;}
	public void setStrasse(String strasse) {this.strasse = strasse;}
	
	public String getHausnr() {return hausnr;}
	public void setHausnr(String hausnr) {this.hausnr = hausnr;}
	
	public int getFlaeche() {return flaeche;}
	public void setFlaeche(int flaeche) {this.flaeche = flaeche;}
	
	public int getStockwerk() {return stockwerk;}
	public void setStockwerk(int stockwerk) {this.stockwerk = stockwerk;}
	
	public int getMietpreis() {return mietpreis;}
	public void setMietpreis(int mietpreis) {this.mietpreis = mietpreis;}
	
	public int getZimmer() {return zimmer;}
	public void setZimmer(int zimmer) {this.zimmer = zimmer;}
	
	public boolean getBalkon() {return balkon;}
	public void setBalkon(Boolean balkon) {this.balkon = balkon;}
	
	public boolean getEbk() {return ebk;}
	public void setEbk(Boolean ebk) {this.ebk = ebk;}
	
	public int getVerwalter() {return verwalter;}
	public void setVerwalter(int verwalter) {this.verwalter = verwalter;}
	
	/**
	 * Lädt eine Wohnung aus der Datenbank
	 * @param id ID der zu ladenden Wohnung
	 * @return Wohnungs-Instanz
	 */
	public static Wohnung load(int id) {
		try {
			// Hole Verbindung
			Connection con = DB2ConnectionManager.getInstance().getConnection();

			// Erzeuge Anfrage
			String selectSQL = "SELECT * FROM wohnung WHERE id = ?";
			PreparedStatement pstmt = con.prepareStatement(selectSQL);
			pstmt.setInt(1, id);

			// Führe Anfrage aus
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				Wohnung ts = new Wohnung();
				ts.setId(rs.getInt("ID"));
				ts.setOrt(rs.getString("ort"));
				ts.setPlz(rs.getString("plz"));
				ts.setStrasse(rs.getString("strasse"));
				ts.setHausnr(rs.getString("hausnr"));
				ts.setFlaeche(rs.getInt("flaeche"));
				ts.setStockwerk(rs.getInt("stockwerk"));
				ts.setMietpreis(rs.getInt("mietpreis"));
				ts.setZimmer(rs.getInt("zimmer"));
				ts.setBalkon(rs.getBoolean("balkon"));
				ts.setEbk(rs.getBoolean("ebk"));
				ts.setVerwalter(rs.getInt("verwalter"));
				
				rs.close();
				pstmt.close();
				return ts;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * Lädt alle Wohnungen aus der Datenbank
	 * @param id ID des zu ladenden Maklers
	 * @return alle Makler
	 */
	public static ArrayList<Wohnung> loadAll() {
		try {
			// Hole Verbindung
			Connection con = DB2ConnectionManager.getInstance().getConnection();

			// Erzeuge Anfrage
			String selectSQL = "SELECT * FROM wohnung";
			PreparedStatement pstmt = con.prepareStatement(selectSQL);

			// Führe Anfrage aus
			ResultSet rs = pstmt.executeQuery();
			ArrayList<Wohnung> allWohnungen = new ArrayList<Wohnung>();
			while (rs.next()) {
				Wohnung ts = new Wohnung();
				ts.setId(rs.getInt("id"));
				ts.setOrt(rs.getString("ort"));
				ts.setPlz(rs.getString("plz"));
				ts.setStrasse(rs.getString("strasse"));
				ts.setHausnr(rs.getString("hausnr"));
				ts.setFlaeche(rs.getInt("flaeche"));
				ts.setStockwerk(rs.getInt("stockwerk"));
				ts.setMietpreis(rs.getInt("mietpreis"));
				ts.setZimmer(rs.getInt("zimmer"));
				ts.setBalkon(rs.getBoolean("balkon"));
				ts.setEbk(rs.getBoolean("ebk"));
				ts.setVerwalter(rs.getInt("verwalter"));

				allWohnungen.add(ts);
			}
			rs.close();
			pstmt.close();
			return allWohnungen;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * Speichert den Makler in der Datenbank. Ist noch keine ID vergeben
	 * worden, wird die generierte Id von DB2 geholt und dem Model übergeben.
	 */
	public void save() {
		// Hole Verbindung
		Connection con = DB2ConnectionManager.getInstance().getConnection();

		try {
			// FC<ge neues Element hinzu, wenn das Objekt noch keine ID hat.
			if (getId() == -1) {
				// Achtung, hier wird noch ein Parameter mitgegeben,
				// damit später generierte IDs zurückgeliefert werden!
				String insertSQL = "INSERT INTO wohnung(ort, plz, strasse, hausnr, flaeche, stockwerk, mietpreis, zimmer, balkon, ebk, verwalter) VALUES (?,?,?,?,?,?,?,?,?,?,?)";

				PreparedStatement pstmt = con.prepareStatement(insertSQL,
						Statement.RETURN_GENERATED_KEYS);

				// Setze Anfrageparameter und führe Anfrage aus
				pstmt.setString	(1, getOrt());
				pstmt.setString	(2, getPlz());
				pstmt.setString	(3, getStrasse());
				pstmt.setString	(4, getHausnr());
				pstmt.setInt	(5, getFlaeche());
				pstmt.setInt	(6, getStockwerk());
				pstmt.setInt	(7, getMietpreis());
				pstmt.setInt	(8, getZimmer());
				pstmt.setBoolean(9, getBalkon());
				pstmt.setBoolean(10, getEbk());
				pstmt.setInt	(11, getVerwalter());
				
				pstmt.executeUpdate();

				// Hole die Id des engefügten Datensatzes
				ResultSet rs = pstmt.getGeneratedKeys();
				if (rs.next()) {
					setId(rs.getInt(1));
				}

				rs.close();
				pstmt.close();
			} else {
				// Falls schon eine ID vorhanden ist, mache ein Update...
				String updateSQL = "UPDATE Wohnung SET ort = ?, plz = ?, strasse = ?, hausnr = ?, flaeche = ?, stockwerk = ?, mietpreis = ?, zimmer = ?, balkon = ?, ebk = ?, Verwalter = ? WHERE id = ?";
				PreparedStatement pstmt = con.prepareStatement(updateSQL);

				// Setze Anfrage Parameter
				pstmt.setString	(1, getOrt());
				pstmt.setString	(2, getPlz());
				pstmt.setString	(3, getStrasse());
				pstmt.setString	(4, getHausnr());
				pstmt.setInt	(5, getFlaeche());
				pstmt.setInt	(6, getStockwerk());
				pstmt.setInt	(7, getMietpreis());
				pstmt.setInt	(8, getZimmer());
				pstmt.setBoolean(9, getBalkon());
				pstmt.setBoolean(10, getEbk());
				pstmt.setInt	(11, getVerwalter());
				pstmt.setInt	(12, getId());
				pstmt.executeUpdate();

				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Löscht den Makler in der Datenbank.
	 * @param id des zu löschenden Maklers
	 */
	public void delete(int id) {
		// Hole Verbindung
		Connection con = DB2ConnectionManager.getInstance().getConnection();

		try {
			if (id != -1) {
				String insertSQL = "Delete wohnung where id = ?";

				PreparedStatement pstmt = con.prepareStatement(insertSQL,
						Statement.RETURN_GENERATED_KEYS);

				// Setze Anfrageparameter und führe Anfrage aus
				pstmt.setInt(1, id);
				pstmt.executeUpdate();

				
				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
